package tool

// by daoyi
//本人封装的工具类，每个工具方法上都含有注释，可自己查看
import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"github.com/gin-gonic/gin"
	"math/rand"
	"net"
	"net/http"
	"path"
	"strconv"
	"strings"

	//"golang.org/x/text/unicode/cldr"
	//"math/rand"
	"os"
	"path/filepath"
	"time"
)

// 获取当前时间
func UnixToTime(timestamp int) string {
	fmt.Println(timestamp)
	t := time.Unix(int64(timestamp), 0)
	return t.Format("2006-01-02 15:04:05")
}

// 获取当前时间戳 单位秒
func GetUnix() int64 {
	return time.Now().Unix()
}

// 获取当前时间戳 单位纳秒
func GetUnixSecond() int64 {
	return time.Now().UnixNano()
}

// 获取当前的日期时间  2022-01-03 05:04:12
func GetDate() string {
	timeUnix := time.Now().Unix()
	return time.Unix(timeUnix, 0).Format("2006-01-02 15:04:05")
}

// 获取当前年月日 2022-01-03
func GetDay() string {
	return time.Now().Format("2006-01-02")
}

// 判断目录或文件是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// CreateDateDir 根据当前日期来创建文件夹
func CreateDateDir(Path string) string {
	folderName := time.Now().Format("20060102")
	folderPath := filepath.Join(Path, folderName)
	if _, err := os.Stat(folderPath); os.IsNotExist(err) {
		// 必须分成两步：先创建文件夹、再修改权限
		os.Mkdir(folderPath, 0777) //0777也可以os.ModePerm
		os.Chmod(folderPath, 0777)
	}
	return folderPath
}

func ClientIP(r *http.Request) string {
	xForwardedFor := r.Header.Get("X-Forwarded-For")
	ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
	if ip != "" {
		return ip
	}
	ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
	if ip != "" {
		return ip
	}
	if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
		return ip
	}
	return ""
}

// md5加密字符串
func Md5string(s string) string {
	h := md5.New()
	h.Write([]byte(s))
	s = hex.EncodeToString(h.Sum(nil))
	return s
}

// 加密
func MakePassword(plainpwd, salt string) string {
	return Md5string(plainpwd + salt)
}

// 密码验证
func PasswordVerify(rawPassword string, password string, salt string) (err interface{}) {
	pwd := Md5string(rawPassword + salt)
	if pwd == password {
		return nil
	} else {
		return "密码不匹配"
	}
}

/**
 * 获取随机数
 * number为个位数，num是number的位数，如：number为4，num当为10000；
 */
func rands(number int, num int) string {

	code := fmt.Sprint("%04v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(10000))
	return code

}

/**
 * 多图上传dome
 */
func Upload(c *gin.Context) map[int]string {
	form, _ := c.MultipartForm()
	files := form.File["face[]"]

	//定义一个map
	path1 := map[int]string{}
	//遍历所有图片
	for i, f := range files {
		i := i
		//获取图像后缀
		y := path.Ext(f.Filename)
		//获取时间戳
		a := time.Now().Unix()
		//获取一个1W以内的随机数
		b := rand.Intn(10000)
		//将时间戳的类型转换
		z := strconv.FormatInt(a, 10)
		//将随机书转换类型
		x := strconv.FormatInt(int64(b), 10)
		mkdirpath := CreateDateDir("./static/upload")
		//写入保持位置与自定义名称，并且带上文件自带的后缀
		dst := path.Join(mkdirpath, z+x+y)
		//保存文件到相应位置
		c.SaveUploadedFile(f, dst)

		//图片地址dst中含有"\\",将地址中的"\\"替换后写入数据库
		res := strings.Replace(dst, "\\", "/", -1)

		path1[i] = res

	}
	//事务提交
	return path1

}
